package be.tarsos.dsp.ui.layers;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import be.tarsos.dsp.ui.Axis;
import be.tarsos.dsp.ui.CoordinateSystem;

public class MouseCursorLayer implements Layer, MouseMotionListener, MouseListener {
	

	
private boolean drawCursor = false;
	
private Point lastPoint = null;
	
private Component component = null;
	

	
boolean onlyDrawVertical = false;
	

	
CoordinateSystem cs;
	
public MouseCursorLayer(CoordinateSystem cs){
		
this.cs=cs;
	
}
	

	
@Override
	
public void draw(Graphics2D graphics) {
		
if(drawCursor){
			
Point2D unitPoint = LayerUtilities.pixelsToUnits(graphics, (int) lastPoint.getX(), (int)lastPoint.getY() );
			
graphics.setColor(Color.blue);
			
if(!onlyDrawVertical){
				
graphics.drawLine(Math.round(cs.getMax(Axis.X)),Math.round((float) unitPoint.getY()), Math.round(cs.getMin(Axis.X)), Math.round((float) unitPoint.getY()));
				
//notify listeners of change
				
this.pcs.firePropertyChange("cursor", null, lastPoint);
			
}
			
graphics.drawLine(Math.round((float) unitPoint.getX()),(int)Math.floor(cs.getMin(Axis.Y)),Math.round((float) unitPoint.getX()),(int) Math.ceil(cs.getMax(Axis.Y)));
		
}
	
}
	


	
@Override
	
public String getName() {
		
return "Cursor Layer";
	
}

	
@Override
	
public void mouseDragged(MouseEvent e) {

	
}

	
@Override
	
public void mouseMoved(MouseEvent e) {
		
lastPoint = e.getPoint();
		
component = e.getComponent();
		
component.repaint();
	
}

	
@Override
	
public void mouseClicked(MouseEvent e) {
		

	
}

	
@Override
	
public void mousePressed(MouseEvent e) {
		
drawCursor = false;
		
component = e.getComponent();
		
component.repaint();
	
}

	
@Override
	
public void mouseReleased(MouseEvent e) {
		
lastPoint = e.getPoint();
		
drawCursor = true;
		

	
}

	
@Override
	
public void mouseEntered(MouseEvent e) {
		
lastPoint = e.getPoint();
		
drawCursor = true;
		
onlyDrawVertical = false;
	
}

	
@Override
	
public void mouseExited(MouseEvent e) {
		
drawCursor = false;
		
component = e.getComponent();
		
component.repaint();
	
}
	

	
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    
public void addPropertyChangeListener(PropertyChangeListener listener) {
        
this.pcs.addPropertyChangeListener(listener);
    
}

    
public void removePropertyChangeListener(PropertyChangeListener listener) {
        
this.pcs.removePropertyChangeListener(listener);
    
}

	
public void setPoint(Point newPosition) {
		
drawCursor = true;
		
onlyDrawVertical = true;
		
lastPoint = newPosition;
		
if(component!=null)
			
component.repaint();
	
}
    


}