import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.ToolTipManager;

import com.jogamp.newt.awt.NewtCanvasAWT;
import com.jogamp.newt.event.MouseEvent;
import com.jogamp.newt.event.MouseListener;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.util.Animator;

public class Test extends JFrame implements GLEventListener, MouseListener, ActionListener {

	public static void main(String[] args) {
		
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new Test();
			}
		});
	}
	
	private GLWindow window;
	private NewtCanvasAWT canvas;
	private JTextField txtMousePosition;
	
	private Point mouseLocation = new Point();
	
	public Test() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);
		JPopupMenu.setDefaultLightWeightPopupEnabled(false);
		
		GLCapabilities caps = new GLCapabilities(GLProfile.getMaxFixedFunc(true));
		caps.setDoubleBuffered(true);
		caps.setStencilBits(1);
		caps.setSampleBuffers(true);
		caps.setNumSamples(2);
		caps.setHardwareAccelerated(true);
		
		window = GLWindow.create(caps);
		window.setUndecorated(true);
		window.addGLEventListener(this);
		window.addMouseListener(this);
		
		canvas = new NewtCanvasAWT(window);
		canvas.setIgnoreRepaint(true);
		canvas.setMinimumSize(new Dimension(400, 600));
		canvas.setPreferredSize(new Dimension(600, 600));
		
		txtMousePosition = new JTextField();
		txtMousePosition.setColumns(10);
		
		JPanel pnlLeft = new JPanel();
		pnlLeft.setPreferredSize(new Dimension(200, 600));
		pnlLeft.add(txtMousePosition);
		
		JPanel pnlRight = new JPanel();
		pnlRight.setLayout(new BorderLayout());
		pnlRight.add(canvas);
		
		JSplitPane pneSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pnlLeft, pnlRight);

		Container container = this.getContentPane();
		container.setLayout(new BorderLayout());
		
		container.add(pneSplit);
		this.pack();
		this.setVisible(true);
		
		Animator animator = new Animator(window);
		animator.setRunAsFastAsPossible(false);
		animator.start();
		
		Timer timer = new Timer(10, this);
		//timer.start();
	}
	
	@Override
	public void mousePressed(MouseEvent e) {
		if (e.getButton() == MouseEvent.BUTTON1) {
			this.canvas.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
			System.out.println("Mouse Pressed");
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		if (e.getButton() == MouseEvent.BUTTON1) {
			this.canvas.setCursor(Cursor.getDefaultCursor());
			System.out.println("Mouse Released");
		}
	}

	@Override
	public void display(GLAutoDrawable drawable) {
		GL2 gl = drawable.getGL().getGL2();
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);
		gl.glMatrixMode(GL2.GL_MODELVIEW);
		gl.glLoadIdentity();
		
		gl.glColor3f(0.0f, 0.0f, 0.0f);
		gl.glBegin(GL.GL_TRIANGLE_FAN);
			gl.glVertex2d(0.0, 0.0);
			gl.glVertex2d(0.5, 0.5);
			gl.glVertex2d(-0.5, 0.5);
		gl.glEnd();
	}

	@Override
	public void init(GLAutoDrawable drawable) {
		GL2 gl = drawable.getGL().getGL2();
		gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		txtMousePosition.setText("(" + this.mouseLocation.x + ", " + this.mouseLocation.y + ")");
	}
	
	// nothing else implemented
	
	@Override
	public void dispose(GLAutoDrawable drawable) {}
	
	@Override
	public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {}
	
	@Override
	public void mouseClicked(MouseEvent e) {}
	
	@Override
	public void mouseEntered(MouseEvent e) {}
	
	@Override
	public void mouseExited(MouseEvent e) {}
	
	@Override
	public void mouseMoved(MouseEvent e) {}

	@Override
	public void mouseDragged(MouseEvent e) {
		mouseLocation = new Point(e.getX(), e.getY());
	}
	
	@Override
	public void mouseWheelMoved(MouseEvent e) {}
}
