import chess.Screen;
import chess.Sprite;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
/*
 * SpriteMouseDelegator.java
 *
 * Created on June 16, 2007, 8:59 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 * Keeps track of a list of Sprites, and watches to see which one
 * should get mouse events.
 * @author jbf
 */
public class SpriteMouseDelegator extends MouseInputAdapter {
    
    Screen screen;
    HashMap<Sprite,MouseInputListener> sprites;
    Sprite currentSprite;
    MouseInputListener currentDelegate= NULL;
    
    /** Creates a new instance of SpriteMouseDelegator */
    public SpriteMouseDelegator( Screen screen ) {
        sprites= new HashMap<Sprite,MouseInputListener>();
        this.screen= screen;
        
    }
    
    // NULL is used when no sprite can receive mouse input.
    private static final MouseInputListener NULL= new MouseInputAdapter() {
        
    };
    
    public void registerSprite( Sprite s, MouseInputListener listener ) {
        sprites.put( s, listener );
    }
    
    public void deregisterSprite( Sprite s ) {
        sprites.remove(s);
    }
    
    private MouseInputListener getDelegate( MouseEvent mouseEvent ) {
        Sprite result= screen.getSpriteAt( mouseEvent.getX(), mouseEvent.getY() );
        if ( result!=currentSprite ) {
            if ( currentSprite!=null ) sprites.get(currentSprite).mouseExited(mouseEvent);
            if ( result!=null ) sprites.get(result).mouseEntered(mouseEvent);
            currentSprite= result;
            currentDelegate= currentSprite==null ? NULL : sprites.get(result);
        }
        return currentDelegate;
    }
    
    public void mouseReleased(MouseEvent mouseEvent) {
        getDelegate(mouseEvent).mouseReleased(mouseEvent);
    }
    
    public void mousePressed(MouseEvent mouseEvent) {
        getDelegate(mouseEvent).mousePressed(mouseEvent);
    }
    
    public void mouseMoved(MouseEvent mouseEvent) {
        getDelegate(mouseEvent).mouseMoved(mouseEvent);
    }
    
    public void mouseExited(MouseEvent mouseEvent) {
        currentDelegate.mouseExited(mouseEvent);
    }
    
    public void mouseEntered(MouseEvent mouseEvent) {
        getDelegate(mouseEvent).mouseEntered(mouseEvent);
    }
    
    public void mouseDragged(MouseEvent mouseEvent) {
        currentDelegate.mouseDragged(mouseEvent);
    }
    
    public void mouseClicked(MouseEvent mouseEvent) {
        getDelegate(mouseEvent).mouseClicked(mouseEvent);
    }
}
