package org.jzy3d.chart.controllers.mouse.camera;



import org.jzy3d.chart.Chart;
import org.jzy3d.chart.controllers.camera.AbstractCameraController;
import org.jzy3d.chart.controllers.mouse.NewtMouseUtilities;
import org.jzy3d.chart.controllers.thread.camera.CameraThreadController;
import org.jzy3d.maths.Coord2d;

import com.jogamp.newt.event.InputEvent;
import com.jogamp.newt.event.MouseEvent;
import com.jogamp.newt.event.MouseListener;



public class NewtCameraMouseController extends AbstractCameraController implements MouseListener{
	
	public NewtCameraMouseController(){
	}
	
	public NewtCameraMouseController(Chart chart){
	    register(chart);
		addSlaveThreadController(new CameraThreadController(chart));
	}
	
	@Override
    public void register(Chart chart){
		super.register(chart);
		chart.getCanvas().addMouseController(this);
	}
	
	@Override
    public void dispose(){
		for(Chart c: targets){
			c.getCanvas().removeMouseController(this);
		}
		super.dispose();
	}
	
	/** Handles toggle between mouse rotation/auto rotation: double-click starts the animated
	 * rotation, while simple click stops it.*/
	@Override
    public void mousePressed(MouseEvent e) {
		// 
		if(handleSlaveThread(e))
		    return;
			
		prevMouse.x  = e.getX();
		prevMouse.y  = e.getY();
	}
	
    public boolean handleSlaveThread(MouseEvent e) {
        if(isDoubleClick(e)){
			if(threadController!=null){
				threadController.start();
				return true;
			}
		}
		if(threadController!=null)
			threadController.stop();
		return false;
    }

	/** Compute shift or rotate*/
	@Override
    public void mouseDragged(MouseEvent e) {
		Coord2d mouse = new Coord2d(e.getX(),e.getY());
		// Rotate
				if(isLeftDown(e)){
					Coord2d move  = mouse.sub(prevMouse).div(100);
					rotate( move );
				}
				// Shift
				else if(isRightDown(e)){
					Coord2d move  = mouse.sub(prevMouse);
					if(move.y!=0)
						shift(move.y/500);
				}
		
		prevMouse = mouse;
	}
	
	public static boolean isLeftDown(MouseEvent e){
    	return (e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK;
	}

	public static boolean isRightDown(MouseEvent e){
		return (e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK; 
	}
	
	public static boolean isDoubleClick(MouseEvent e){
    	return (e.getClickCount() > 1);
	}
	
	/** Compute zoom */
	@Override
    public void mouseWheelMoved(MouseEvent e) {
		stopThreadController();
		
		float factor = NewtMouseUtilities.convertWheelRotation(e, 1.0f, 10.0f);
		zoomZ(factor);
	}
	
	@Override
    public void mouseClicked(MouseEvent e) {}  
	@Override
    public void mouseEntered(MouseEvent e) {}
	@Override
    public void mouseExited(MouseEvent e) {}
	@Override
    public void mouseReleased(MouseEvent e) {} 
	@Override
    public void mouseMoved(MouseEvent e) {}
}

 

Ads help maintain this website.