/*******************************************************************************
 * Copyright (c) 2018 Red Hat and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Red Hat - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;


import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/*
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specificlanguage governing rights and limitations under the License.
 *
 * The Initial Developer of the Original Code is Gregor Mueckl.
 * All Rights Reserved.
 *
 * Created on Nov 16, 2005
 */

public class Bug144120_GLCanvasMouseEvents {

	private class MyMouseMoveListener implements MouseMoveListener {

		@Override
		public void mouseMove(MouseEvent event) {
			long time=System.currentTimeMillis();
			System.out.println(Long.valueOf(time).toString() + " mouse move: " + event.x + " " + event.y);
			try {
				synchronized(this) {
					wait(100);
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	private class MyMouseListener implements MouseListener {

		@Override
		public void mouseDoubleClick(MouseEvent event) {
			long time=System.currentTimeMillis();
			System.out.println(Long.valueOf(time).toString() + " mouse doubleclick: " + event.x + " " + event.y);
		}

		@Override
		public void mouseDown(MouseEvent event) {
			long time=System.currentTimeMillis();
			System.out.println(Long.valueOf(time).toString() + " mouse move: " + event.x + " " + event.y);
			try {
				synchronized(this) {
					wait(100);
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Long.valueOf(time).toString() + " mouse down: " + event.x + " " + event.y);
		}

		@Override
		public void mouseUp(MouseEvent event) {
			long time=System.currentTimeMillis();
			System.out.println(Long.valueOf(time).toString() + " mouse move: " + event.x + " " + event.y);
			try {
				synchronized(this) {
					wait(100);
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Long.valueOf(time).toString() + " mouse up: " + event.x + " " + event.y);
		}

	}

	public Bug144120_GLCanvasMouseEvents() {
		Display display=new Display();
		Shell shell=new Shell();
		GLCanvas glcanvas=new GLCanvas(shell,0, new GLData());

		glcanvas.addMouseMoveListener(new MyMouseMoveListener());
		glcanvas.addMouseListener(new MyMouseListener());

		glcanvas.setSize(300,300);

		shell.pack();

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	public static void main(String args[]) {
	}
}
