import java.awt.event.*; import java.awt.*; import java.lang.Math; class RotarHandler implements ActionListener { private Dibujo dibujo; private Point ancla; private double anguloReferencia; private Cruz cruz; private int estado; private static final int INICIO_NUEVA_ROTACION=0; private static final int ANCLA_FIJADA=1; private static final int TERMINO_ROTACION=2; public RotarHandler(Dibujo dib) { dibujo = dib; cruz = new Cruz(); } public void actionPerformed(ActionEvent e) { dibujo.changeMouseListener(new MouseHandler()); dibujo.changeMouseMotionListener(new MouseMotionHandler()); estado = INICIO_NUEVA_ROTACION; } class MouseHandler extends MouseAdapter { public void mouseClicked(MouseEvent event) { if (estado==INICIO_NUEVA_ROTACION) { ancla = event.getPoint(); dibujo.remueva(cruz); cruz.setPoint(ancla); dibujo.incorpore(cruz); estado = ANCLA_FIJADA; } } public void mousePressed (MouseEvent event) { if (estado==ANCLA_FIJADA) { Point p = event.getPoint(); double x = p.getX()-ancla.getX(); double y = p.getY()-ancla.getY(); anguloReferencia= Math.atan2(y, x); } if (estado==TERMINO_ROTACION) estado=INICIO_NUEVA_ROTACION; } public void mouseReleased(MouseEvent event) { if (estado==ANCLA_FIJADA){ dibujo.remueva(cruz); estado = TERMINO_ROTACION; } } } class MouseMotionHandler extends MouseMotionAdapter { public void mouseDragged(MouseEvent event) { if (estado == ANCLA_FIJADA) { Point p = event.getPoint(); double x = p.getX()-ancla.getX(); double y = p.getY()-ancla.getY(); double nuevoAngulo = Math.atan2(y, x); double deltaAngulo= nuevoAngulo-anguloReferencia; dibujo.rotar(ancla, deltaAngulo); anguloReferencia= nuevoAngulo; } } } }