content: package edu.stanford.rsl.conrad.opencl.GLCLDemo;
  
  import java.awt.Component;
  import java.awt.Point;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.awt.event.MouseMotionAdapter;
  import java.awt.event.MouseWheelEvent;
  import java.awt.event.MouseWheelListener;
  import javax.media.opengl.GL2;
  
  /**
   * Utility class for interacting with a scene. Supports rotation and zoom around origin.
   * @author Michael Bien
   */
  public class UserSceneInteraction {
  
      private float z = -20;
      private float rotx = 45;
      private float roty = 30;
  
      private Point dragstart;
      private enum MOUSE_MODE { DRAG_ROTATE, DRAG_ZOOM }
      private MOUSE_MODE dragmode = MOUSE_MODE.DRAG_ROTATE;
  
  
      public void init(Component component) {
          initMouseListeners(component);
      }
  
      private void initMouseListeners(Component component) {
          component.addMouseMotionListener(new MouseMotionAdapter() {
  
              @Override
              public void mouseDragged(MouseEvent e) {
  
                  if (dragstart != null) {
                      switch (dragmode) {
                          case DRAG_ROTATE:
                              rotx += e.getY() - dragstart.getY();
                              roty += e.getX() - dragstart.getX();
                              break;
                          case DRAG_ZOOM:
                              z += (e.getY() - dragstart.getY()) / 5.0f;
                              break;
                      }
                  }
  
                  dragstart = e.getPoint();
              }
          });
          component.addMouseWheelListener(new MouseWheelListener() {
  
              public void mouseWheelMoved(MouseWheelEvent e) {
                  z += e.getWheelRotation()*5;
              }
  
          });
          component.addMouseListener(new MouseAdapter() {
  
              @Override
              public void mousePressed(MouseEvent e) {
                  switch (e.getButton()) {
                      case (MouseEvent.BUTTON1):
                          dragmode = MOUSE_MODE.DRAG_ROTATE;
                          break;
                      case (MouseEvent.BUTTON2):
                          dragmode = MOUSE_MODE.DRAG_ZOOM;
                          break;
                      case (MouseEvent.BUTTON3):
                          dragmode = MOUSE_MODE.DRAG_ZOOM;
                          break;
                  }
              }
  
              @Override
              public void mouseReleased(MouseEvent e) {
                  switch (e.getButton()) {
                      case (MouseEvent.BUTTON1):
                          dragmode = MOUSE_MODE.DRAG_ZOOM;
                          break;
                      case (MouseEvent.BUTTON2):
                          dragmode = MOUSE_MODE.DRAG_ROTATE;
                          break;
                      case (MouseEvent.BUTTON3):
                          dragmode = MOUSE_MODE.DRAG_ROTATE;
                          break;
                  }
  
                  dragstart = null;
              }
          });
      }
  
  
      public void interact(GL2 gl) {
          gl.glTranslatef(0, 0, z);
          gl.glRotatef(rotx, 1f, 0f, 0f);
          gl.glRotatef(roty, 0f, 1.0f, 0f);
      }
  
  
  }